package Exports;
import java.io.BufferedInputStream;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map.Entry;
import Bricklink.BricklinkAPI;
import Bricklink.BrickBuilder.api.BrickBuilderClient;
import Bricklink.BrickBuilder.api.CompatibleInfo.CompatibleColorsRequest;
import Bricklink.BrickBuilder.api.CompatibleInfo.CompatibleColorsResponse;
import Bricklink.BrickBuilder.api.CompatibleInfo.CompatibleIDRequest;
import Bricklink.BrickBuilder.api.CompatibleInfo.CompatibleIDResponse;
import Bricklink.BrickBuilder.api.CompatibleInfo.UpdateCompatibleColorRequest;
import Bricklink.BrickBuilder.api.CompatibleInfo.UpdateCompatibleIDsRequest;
import Bricklink.BrickBuilder.api.Connectivity.ConnectivitiesRequest;
import Bricklink.BrickBuilder.api.Connectivity.ConnectivitiesResponse;
import Bricklink.BrickBuilder.api.Connectivity.UploadConnectivityRequest;
import Bricklink.BrickBuilder.api.LDrawPart.LDrawPartsRequest;
import Bricklink.BrickBuilder.api.LDrawPart.LDrawPartsResponse;
import Bricklink.BrickBuilder.api.LDrawPart.UploadLDrawPartRequest;
import Bricklink.BrickBuilder.data.ConnectivityDT;
import Bricklink.BrickBuilder.data.IDMappingDT;
import Bricklink.BrickBuilder.data.LDrawPartDT;
import Bricklink.org.kleini.bricklink.api.Request;
import Bricklink.org.kleini.bricklink.api.Response;
import Builder.BuilderConfigurationManager;
import LDraw.Support.ConnectivityLibrary;
import LDraw.Support.LDrawPaths;
import LDraw.Support.PartCache;
import Window.BackgroundThreadManager;
public class UpdateManager {
private static UpdateManager _instance = null;
private HashMap<String, String> idMappingInfoMapFromLDraw;
private HashMap<String, String> idMappingInfoMapFromBricklink;
private HashMap<Integer, Integer> colorMappingInfoMapFromLDraw;
private HashMap<Integer, Integer> colorMappingInfoMapFromBricklink;
private HashMap<String, ConnectivityDT> connectivityInfo;
private HashMap<String, LDrawPartDT> partInfo;
private boolean isServerConnectible = true;
private UpdateManager() {
idMappingInfoMapFromLDraw = new HashMap<String, String>();
idMappingInfoMapFromBricklink = new HashMap<String, String>();
colorMappingInfoMapFromLDraw = new HashMap<Integer, Integer>();
colorMappingInfoMapFromBricklink = new HashMap<Integer, Integer>();
connectivityInfo = new HashMap<String, ConnectivityDT>();
partInfo = new HashMap<String, LDrawPartDT>();
// BackgroundThreadManager.getInstance().add(new Runnable() {
// @Override
// public void run() {
// loadColorMappingInfo();
// System.out.println("loadColorMappingInfo done");
// }
// });
// BackgroundThreadManager.getInstance().add(new Runnable() {
// @Override
// public void run() {
// loadConnectivityInfo();
// System.out.println("loadConnectivityInfo done");
// }
// });
// BackgroundThreadManager.getInstance().add(new Runnable() {
// @Override
// public void run() {
// loadIdMappingInfo();
// System.out.println("loadIdMappingInfo done");
// }
// });
// BackgroundThreadManager.getInstance().add(new Runnable() {
// @Override
// public void run() {
// loadLDrawPartInfo();
// System.out.println("loadLDrawPartInfo done");
// }
// });
}
private void loadLDrawPartInfo() {
partInfo.clear();
if (!isServerConnectible)
return;
BrickBuilderClient client = BricklinkAPI.getInstance()
.getBrickBuilderClient();
Request request = new LDrawPartsRequest(false);
Response response = null;
try {
response = client.execute(request);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
isServerConnectible = false;
}
if (response != null)
for (LDrawPartDT dt : ((LDrawPartsResponse) response)
.getLDrawPartDTList()) {
partInfo.put(dt.getId().toLowerCase(), dt);
}
}
private void loadConnectivityInfo() {
connectivityInfo.clear();
if (!isServerConnectible)
return;
BrickBuilderClient client = BricklinkAPI.getInstance()
.getBrickBuilderClient();
Request request = new ConnectivitiesRequest(false);
Response response = null;
try {
response = client.execute(request);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
isServerConnectible = false;
}
if (response != null)
for (ConnectivityDT connectivityDT : ((ConnectivitiesResponse) response)
.getConnectivityList()) {
connectivityInfo.put(connectivityDT.getId(), connectivityDT);
}
}
private void loadColorMappingInfo() {
colorMappingInfoMapFromLDraw.clear();
colorMappingInfoMapFromBricklink.clear();
if (!isServerConnectible)
return;
// obtain all id mapping info from server
BrickBuilderClient client = BricklinkAPI.getInstance()
.getBrickBuilderClient();
Request request = new CompatibleColorsRequest(PartDomainT.LDRAW, false);
Response response = null;
try {
response = client.execute(request);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
isServerConnectible = false;
}
if (response != null)
for (IDMappingDT idMappingDT : ((CompatibleColorsResponse) response)
.getMappingList()) {
colorMappingInfoMapFromLDraw.put(
Integer.parseInt(idMappingDT.getFromId().getId()),
Integer.parseInt(idMappingDT.getToId().getId()));
}
request = new CompatibleColorsRequest(PartDomainT.BRICKLINK, false);
response = null;
try {
response = client.execute(request);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
isServerConnectible = false;
}
if (response != null)
for (IDMappingDT idMappingDT : ((CompatibleColorsResponse) response)
.getMappingList()) {
colorMappingInfoMapFromBricklink.put(
Integer.parseInt(idMappingDT.getFromId().getId()),
Integer.parseInt(idMappingDT.getToId().getId()));
}
}
private void loadIdMappingInfo() {
idMappingInfoMapFromLDraw.clear();
idMappingInfoMapFromBricklink.clear();
if (!isServerConnectible)
return;
// obtain all id mapping info from server
BrickBuilderClient client = BricklinkAPI.getInstance()
.getBrickBuilderClient();
Request request = new CompatibleIDRequest(PartDomainT.LDRAW, false);
Response response = null;
try {
response = client.execute(request);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
isServerConnectible = false;
}
if (response != null)
for (IDMappingDT idMappingDT : ((CompatibleIDResponse) response)
.getMappingList()) {
idMappingInfoMapFromLDraw.put(idMappingDT.getFromId().getId()
.toLowerCase(), idMappingDT.getToId().getId()
.toLowerCase());
}
request = new CompatibleIDRequest(PartDomainT.BRICKLINK, false);
response = null;
try {
response = client.execute(request);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
isServerConnectible = false;
}
if (response != null)
for (IDMappingDT idMappingDT : ((CompatibleIDResponse) response)
.getMappingList()) {
idMappingInfoMapFromBricklink.put(idMappingDT.getFromId()
.getId().toLowerCase(), idMappingDT.getToId().getId()
.toLowerCase());
}
}
public synchronized static UpdateManager getInstance() {
if (_instance == null)
_instance = new UpdateManager();
return _instance;
}
public HashMap<String, String> getIdMappingInfoMapFromLDraw() {
if (idMappingInfoMapFromLDraw.size() == 0)
loadIdMappingInfo();
return new HashMap<String, String>(idMappingInfoMapFromLDraw);
}
public HashMap<String, String> getIdMappingInfoMapFromBricklink() {
if (idMappingInfoMapFromBricklink.size() == 0)
loadIdMappingInfo();
return new HashMap<String, String>(idMappingInfoMapFromBricklink);
}
public HashMap<Integer, Integer> getColorMappingInfoMapFromLDraw() {
if (colorMappingInfoMapFromLDraw.size() == 0)
loadColorMappingInfo();
return new HashMap<Integer, Integer>(colorMappingInfoMapFromLDraw);
}
public HashMap<Integer, Integer> getColorMappingInfoMapFromBricklink() {
if (colorMappingInfoMapFromBricklink.size() == 0)
loadColorMappingInfo();
return new HashMap<Integer, Integer>(colorMappingInfoMapFromBricklink);
}
public ArrayList<String> getConnectivityInfoList() {
if (connectivityInfo.size() == 0)
loadConnectivityInfo();
ArrayList<String> retList = new ArrayList<String>(
connectivityInfo.keySet());
return retList;
}
public ArrayList<String> getPartList() {
if (partInfo.size() == 0)
loadLDrawPartInfo();
ArrayList<String> retList = new ArrayList<String>(partInfo.keySet());
return retList;
}
public void downloadNewConnectivities() {
if (!isServerConnectible)
return;
final ArrayList<String> connectivityInfoList_server = UpdateManager
.getInstance().getConnectivityInfoList();
final ArrayList<String> connectivityInfoList_local = ConnectivityLibrary
.getInstance().getAllConnectiblePartIdList();
for (final String partId : connectivityInfoList_server) {
boolean isAlreadyExist = false;
for (String partId_local : connectivityInfoList_local)
if (partId.equals(partId_local)) {
isAlreadyExist = true;
break;
}
if (isAlreadyExist == true)
continue;
BackgroundThreadManager.getInstance().add(new Runnable() {
@Override
public void run() {
ConnectivityDT dt = connectivityInfo.get(partId);
String url = BricklinkAPI.getInstance()
.getBrickBuilderClient().getBaseURL()
+ dt.getFileURL();
try {
InputStream is = new URL(url).openStream();
BufferedInputStream bis = new BufferedInputStream(is);
FileWriter fw = new FileWriter(new File(
"./Resource/Connectivity/" + partId + ".conn"));
BufferedWriter bw = new BufferedWriter(fw);
byte[] bytes = new byte[1024];
while (bis.read(bytes) != -1)
bw.write(new String(bytes));
bw.close();
fw.close();
bis.close();
is.close();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
BackgroundThreadManager.getInstance().add(new Runnable() {
@Override
public void run() {
loadConnectivityInfo();
}
});
}
public void uploadCustomConnectivities() {
if (!isServerConnectible)
return;
ArrayList<String> connectivityInfoList_server = UpdateManager
.getInstance().getConnectivityInfoList();
ArrayList<String> connectivityInfoList_local = ConnectivityLibrary
.getInstance().getAllConnectiblePartIdList();
BrickBuilderClient client = BricklinkAPI.getInstance()
.getBrickBuilderClient();
for (String partId : connectivityInfoList_local) {
boolean isAlreadyExist = false;
for (String partId_server : connectivityInfoList_server)
if (partId.equals(partId_server)) {
isAlreadyExist = true;
break;
}
if (isAlreadyExist == true)
continue;
Request request = new UploadConnectivityRequest(partId,
"./Resource/connectivity/" + partId + ".conn");
try {
Response response = client.execute(request);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
isServerConnectible = false;
break;
}
}
loadConnectivityInfo();
}
public void uploadCustomParts() {
if (!isServerConnectible)
return;
ArrayList<String> partsList_server = getPartList();
ArrayList<String> partsList_local = PartCache.getInstance()
.getAllParts();
BrickBuilderClient client = BricklinkAPI.getInstance()
.getBrickBuilderClient();
for (String partId : partsList_local) {
boolean isAlreadyExist = false;
for (String partId_server : partsList_server)
if (partId.equals(partId_server)) {
isAlreadyExist = true;
break;
}
if (isAlreadyExist == true)
continue;
String filePath = LDrawPaths.getInstance().pathForPartName(
partId + ".dat");
if (filePath == null)
continue;
Request request = new UploadLDrawPartRequest(partId, filePath);
try {
Response response = client.execute(request);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
isServerConnectible = false;
break;
}
}
loadLDrawPartInfo();
}
public void downloadNewParts() {
if (!isServerConnectible)
return;
final ArrayList<String> partsList_server = UpdateManager.getInstance()
.getPartList();
final ArrayList<String> partsList_local = PartCache.getInstance()
.getAllParts();
for (final String partId : partsList_server) {
boolean isAlreadyExist = false;
for (String partId_local : partsList_local)
if (partId.equals(partId_local)) {
isAlreadyExist = true;
break;
}
if (isAlreadyExist == true)
continue;
BackgroundThreadManager.getInstance().add(new Runnable() {
@Override
public void run() {
LDrawPartDT dt = partInfo.get(partId);
String url = BricklinkAPI.getInstance()
.getBrickBuilderClient().getBaseURL()
+ dt.getFileURL();
System.out.println(url);
System.out.println(BuilderConfigurationManager
.getInstance().getLDrawDirectory()
+ "parts/"
+ partId + ".dat");
try {
InputStream is = new URL(url).openStream();
BufferedInputStream bis = new BufferedInputStream(is);
FileWriter fw = new FileWriter(new File(
BuilderConfigurationManager.getInstance()
.getLDrawDirectory()
+ "parts/"
+ partId + ".dat"));
BufferedWriter bw = new BufferedWriter(fw);
byte[] bytes = new byte[1024];
while (bis.read(bytes) != -1)
bw.write(new String(bytes));
bw.close();
fw.close();
bis.close();
is.close();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
BackgroundThreadManager.getInstance().add(new Runnable() {
@Override
public void run() {
loadLDrawPartInfo();
PartCache.getInstance().reInit();
}
});
}
public void uploadIdMappingList() {
if (!isServerConnectible)
return;
BrickBuilderClient client = BricklinkAPI.getInstance()
.getBrickBuilderClient();
HashMap<String, PartIds> partIdsFromLDraw_local = CompatiblePartManager
.getInstance().getAllPartsInDomain(PartDomainT.LDRAW);
HashMap<String, String> partIdsFromLDraw_server = getIdMappingInfoMapFromLDraw();
Request request;
for (Entry<String, PartIds> entry : partIdsFromLDraw_local.entrySet()) {
boolean isArleadyUploaded = false;
if (entry.getValue().getId(PartDomainT.BRICKLINK) != null) {
String id = null;
for (String tempId : entry.getValue().getId(
PartDomainT.BRICKLINK))
if (id == null)
id = tempId;
else
id += "+" + tempId;
if (partIdsFromLDraw_server.containsKey(entry.getKey())
&& partIdsFromLDraw_server.get(entry.getKey()).equals(
id)) {
isArleadyUploaded = true;
}
} else
continue;
if (isArleadyUploaded)
continue;
String bricklinkId = null;
if (entry.getValue().getId(PartDomainT.BRICKLINK) != null)
for (String id : entry.getValue().getId(PartDomainT.BRICKLINK))
if (bricklinkId == null)
bricklinkId = id;
else
bricklinkId += "+" + id;
request = new UpdateCompatibleIDsRequest(entry.getKey(),
PartDomainT.LDRAW, bricklinkId, PartDomainT.BRICKLINK);
try {
client.execute(request);
idMappingInfoMapFromLDraw.put(entry.getKey(), bricklinkId);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
isServerConnectible = false;
break;
}
}
HashMap<String, PartIds> partIdsFromBricklink_local = CompatiblePartManager
.getInstance().getAllPartsInDomain(PartDomainT.BRICKLINK);
HashMap<String, String> partIdsFromBricklink_server = getIdMappingInfoMapFromBricklink();
for (Entry<String, PartIds> entry : partIdsFromBricklink_local
.entrySet()) {
boolean isArleadyUploaded = false;
if (entry.getValue().getId(PartDomainT.LDRAW) != null) {
String id = null;
for (String tempId : entry.getValue().getId(PartDomainT.LDRAW))
if (id == null)
id = tempId;
else
id += "+" + tempId;
if (partIdsFromBricklink_server.containsKey(entry.getKey())
&& partIdsFromBricklink_server.get(entry.getKey())
.equals(id)) {
isArleadyUploaded = true;
}
} else
continue;
if (isArleadyUploaded)
continue;
String ldrawId = null;
if (entry.getValue().getId(PartDomainT.LDRAW) != null)
for (String id : entry.getValue().getId(PartDomainT.LDRAW))
if (ldrawId == null)
ldrawId = id;
else
ldrawId += "+" + id;
request = new UpdateCompatibleIDsRequest(entry.getKey(),
PartDomainT.BRICKLINK, ldrawId, PartDomainT.LDRAW);
try {
client.execute(request);
idMappingInfoMapFromBricklink.put(entry.getKey(), ldrawId);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
isServerConnectible = false;
break;
}
}
// loadIdMappingInfo();
}
public void uploadColorMappingList() {
if (!isServerConnectible)
return;
BrickBuilderClient client = BricklinkAPI.getInstance()
.getBrickBuilderClient();
HashMap<Integer, PartColors> partColorsFromLDraw_local = CompatiblePartManager
.getInstance().getAllColorsInDomain(PartDomainT.LDRAW);
HashMap<Integer, Integer> partColorsFromLDraw_server = getColorMappingInfoMapFromLDraw();
Request request;
for (Entry<Integer, PartColors> entry : partColorsFromLDraw_local
.entrySet()) {
boolean isArleadyUploaded = false;
if (entry.getValue().getColorId(PartDomainT.BRICKLINK) != null) {
if (partColorsFromLDraw_server.containsKey(entry.getKey())
&& partColorsFromLDraw_server.get(entry.getKey())
.equals(entry.getValue().getColorId(
PartDomainT.BRICKLINK))) {
isArleadyUploaded = true;
}
} else
continue;
if (isArleadyUploaded)
continue;
request = new UpdateCompatibleColorRequest("" + entry.getKey(),
PartDomainT.LDRAW, ""
+ entry.getValue()
.getColorId(PartDomainT.BRICKLINK),
PartDomainT.BRICKLINK);
try {
client.execute(request);
colorMappingInfoMapFromLDraw.put(entry.getKey(), +entry
.getValue().getColorId(PartDomainT.BRICKLINK));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
isServerConnectible = false;
break;
}
}
HashMap<Integer, PartColors> partColorsFromBricklink_local = CompatiblePartManager
.getInstance().getAllColorsInDomain(PartDomainT.BRICKLINK);
HashMap<Integer, Integer> partColorsFromBricklink_server = getColorMappingInfoMapFromBricklink();
for (Entry<Integer, PartColors> entry : partColorsFromBricklink_local
.entrySet()) {
boolean isArleadyUploaded = false;
if (entry.getValue().getColorId(PartDomainT.LDRAW) != null) {
if (partColorsFromBricklink_server.containsKey(entry.getKey())
&& partColorsFromBricklink_server.get(entry.getKey())
.equals(entry.getValue().getColorId(
PartDomainT.LDRAW))) {
isArleadyUploaded = true;
}
} else
continue;
if (isArleadyUploaded)
continue;
request = new UpdateCompatibleColorRequest("" + entry.getKey(),
PartDomainT.BRICKLINK, ""
+ entry.getValue().getColorId(PartDomainT.LDRAW),
PartDomainT.LDRAW);
try {
client.execute(request);
colorMappingInfoMapFromLDraw.put(entry.getKey(), +entry
.getValue().getColorId(PartDomainT.LDRAW));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
isServerConnectible = false;
break;
}
}
// loadColorMappingInfo();
}
}